#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTreeWidgetItem>  // 用于设备列表的树形控件项
#include <QJsonObject>      // 用于解析 JSON 数据
#include <QJsonArray>       // 用于解析 JSON 数据
#include <QFileDialog>      // 用于文件对话框
#include <QMessageBox>      // 用于弹出消息框
#include <QSlider>          // 用于滑块控件
#include <QPushButton>      // 用于按钮控件
#include <QLineEdit>        // 用于文本框控件
#include <QLabel>           // 用于标签控件
#include <QHBoxLayout>      // 用于布局控件
#include <QGroupBox>        // 用于容纳控件的框
#include <QFile>
#include <QJsonDocument>
#include <QWidget>
#include <QGridLayout>
#include <QVBoxLayout>  // 用于外部布局管理
#include <QDebug>
#include <QMenu>
#include <QPainter>
#include <QAction>
#include <QTextBrowser>
#include <QMouseEvent>
#include <QScrollBar>
#include <QTimer>
#include <QStandardPaths>
#include <QThread>

#include "joint.h"
#include "tool_tcp.h"
#include "movejoint.h"
#include "movetool.h"
#include "modelcontrol.h"
#include "liftcontrol.h"
#include "pincontrol.h"
#include "singlestepcontrol.h"
#include "multistepcontrol.h"
#include "overall.h"
#include "moverup.h"
#include "moverdown.h"
#include "moverdownstatus.h"
#include "moverupstatus.h"
#include "selectdevice.h"
#include "switchstaus.h"
#include "caskmovecontrol.h"
#include "caskstopcontrol.h"
#include "caskstatus.h"
#include "messagecontrol.h"
#include "configdialog.h"
#include "deviceitemwidget.h"
#include "messageitemwidget.h"


#include "DdsClientWrapper.hpp"
#include <QHash>
#include <QJsonParseError>
#include <QJsonValue>
#include "DeviceManager.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class DdsClientWrapper;      // dds封装类

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_44_clicked();  // 点击按钮，加载 JSON 数据并更新设备
    void on_pushButton_48_clicked();  // 点击按钮，添加场景选择页面
    // void on_pusherbutton_clicked();
    void onColorChanged(const QString &color);
    // 这个槽函数用于处理颜色变化
    // 用于接收数据并更新 QTextBrowser 内容
    void onDataReceived(const QString &message);  // 接收传入的消息

    // 根据消息等级更新 QTextBrowser 内容并设置不同颜色
    void appendMessage(const QString &message, const QString &level);
    void clearMessageItems(QWidget *container);
    void exportContent(QWidget *container, const QString &filename);

    // 右键菜单相关
    void showLogContextMenu(const QPoint &pos);
    void exportTextBrowserContent(QTextBrowser* browser, const QString& defaultFileName);
    void openMessageControlDialog();   // 新增：处理左键点击
    void openConfigDialog();   // 新增：处理左键点击
    void onUpdateFlag3ControlReceived(const QJsonObject &jsonData);



    void createAndSubscribeNewNode(uint32_t domainId, const QString& deviceID);

    void on_pushButton_47_clicked();

    void upEventMsg(const QStringList &evt);
signals:
    void initDeviceSwitch();

private:
    Ui::MainWindow *ui;

    DdsClientWrapper *ddsClient_;
    // 新增的私有成员函数
    void readJsonAndUpdateDevices(QJsonDocument &doc);  // 读取 JSON 文件并更新设备列表
    void addDeviceToList(const QString &deviceName);  // 添加设备到设备树
    void readJsonAndUpdateTab(QJsonDocument &doc);  // 根据 JSON 更新 Tab 页
    void addJointsToDevice(const QString &deviceName, const QJsonObject &functionDetails); // 创建关节
    QTreeWidgetItem* findDeviceItem(const QString &deviceName);  // 查找设备项
    void addCMORDeviceTolist(QString deviceName,QJsonObject &functions);// 根据设备名称和json内容在设备列表中添加设备
    void addMoverDeviceTolist(QString deviceName,QJsonObject &functions);
     void addCaskDeviceTolist(QString deviceName,QJsonObject &functions);
    void addCMORDeviceToTab(QString deviceName,QJsonObject &functions,QJsonObject & status); // 根据设备名称和json内容在tab页中添加设备
    void addMoverDeviceToTab(QString deviceName,QJsonObject &functions,QJsonObject & status); // 根据设备名称和json内容在tab页中添加设备
    void addCaskDeviceToTab(QString deviceName,QJsonObject &functions,QJsonObject & status); // 根据设备名称和json内容在tab页中添加设备
    void onDeviceTreeItemClicked(QTreeWidgetItem *item, int column);
    QList<QString> getFunctionOrder(const QJsonObject &functions);
    void showContextMenu(const QPoint &pos);
    void deleteDeviceItem(QTreeWidgetItem *item);

    void setDeviceActiveStatus(QTreeWidgetItem *item, bool isActive, const QString &color = "gray");
    void updateActiveDeviceStatus(QTreeWidgetItem *selectedItem);
    //void connectSignalSlot();  // 调用新的函数进行信号连接
    void addDeviceToTab(QString deviceName,QJsonObject &functions,QJsonObject & status);
    QHash<QString, CaskMoveControl*> functionNameToWidgetMap;


    // 自定义标题栏相关
    QPoint m_dragPos;           // 拖动起始点
    bool m_mousePressed = false; // 拖动标志

    // 标题栏按钮槽函数
    void on_btnMinimize_clicked();
    void on_btnMaximize_clicked();
    void on_btnClose_clicked();


    void on_msgStatuReceived(const QString &msg);  // 订阅到消息时处理
    QList<DdsClientWrapper*> ddsClients_; // 保存所有创建的客户端
    void processStatuMessage(const QString &jsonString);//解析 JSON 数据
    void processEventMessage(const QString &jsonString);//解析 JSON 数据
    void on_msgEventReceived(const QString &msg);

    void initNode();

    //全局变量
    QString currentDevice;//当前设备ID
    struct mMessage {
        QString device_id;
        QString timestamp;
        QHash<QString, QString> mContent;
    };
    // 设备信息结构体
    struct DeviceInfo {
        QString deviceName;      // 设备名称
        QString deviceID;        // 设备ID
        QString system;          // 系统类型
        bool isRobot;            // 是否为机器人
        QString manufacturer;    // 制造商
        QString serialNumber;    // 序列号
    };
    DeviceInfo deviceinfo;

    QHash<QString, mMessage> mStatus;
    QHash<QString, mMessage> mEvent;
    SwitchStaus * switchStaus;

    QStringList currentFilters;  // 存储当前的事件消息筛选条件
    QStringList deviceIDList;//存储加载了的设备节点名称

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;

    void closeEvent(QCloseEvent* event) override;//通信
    //void closeEvent(QCloseEvent *event) override;


};

#endif // MAINWINDOW_H
